package ar.edu.utn.frba.dds.opendesigners.aerolineas;

import ar.edu.utn.frba.dds.opendesigners.ParametroBusqueda;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionCompraAsiento;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionReservaAsiento;
import ar.edu.utn.frba.dds.opendesigners.reservas.Reservas;
import ar.edu.utn.frba.dds.opendesigners.resultados.ResultadoBusqueda;
import ar.edu.utn.frba.dds.opendesigners.resultados.Asiento;
import ar.edu.utn.frba.dds.opendesigners.resultados.VueloDirecto;

import com.lanchita.excepciones.EstadoErroneoException;

import java.math.BigDecimal;

public class LanchitaAdapter extends AerolineaAdapter {
	
	private InterfaceLanchita instanciaLanchita;

	public LanchitaAdapter(InterfaceLanchita aerolineaLanchita, Reservas reservasDeAterrizar){
		this.instanciaLanchita = aerolineaLanchita;
		this.registroReservas = reservasDeAterrizar;
	}
	
	@Override
	public ResultadoBusqueda buscar(ParametroBusqueda parametroBusqueda) {
		
		ResultadoBusqueda totalResultadosBusqueda = new ResultadoBusqueda();
				
		//Tengo que buscar todos según la fecha...
		String[][] resultados = this.instanciaLanchita.asientosDisponibles(
				parametroBusqueda.getOrigen(), parametroBusqueda.getDestino(), 
				parametroBusqueda.getFecha(), null, 
				null, null);
	
		totalResultadosBusqueda.agregarResultadoBusqueda(this.parseResults(resultados));
		
		//Si viene con la fecha, hago una consulta más con esa fecha al fin (si no vino con la anterior me alcanza porque me trae todos)
		if (parametroBusqueda.getFecha() != ""){
			//Tengo que buscar todos según la fecha...
			String[][] resultados2 = this.instanciaLanchita.asientosDisponibles(
					parametroBusqueda.getOrigen(), parametroBusqueda.getDestino(), 
					null, null, 
					parametroBusqueda.getFecha(), null);
		
			totalResultadosBusqueda.agregarResultadoBusqueda(this.parseResults(resultados2));
		}
		
		//Filtros:
		totalResultadosBusqueda.filtrarPor(parametroBusqueda.getOrigen(), parametroBusqueda.getDestino());
		totalResultadosBusqueda.filtrarPorRangoDe(parametroBusqueda.getPrecioMinimo(), parametroBusqueda.getPrecioMaximo());
		totalResultadosBusqueda.filtrarPor(parametroBusqueda.getIncluyeAsientosReservados());
		totalResultadosBusqueda.filtrarPor(parametroBusqueda.getTipoAsiento());
		
		return totalResultadosBusqueda;
	}

	private InterfaceLanchita getInstanciaLanchita() {
		// TODO Auto-generated method stub
		return this.instanciaLanchita;
	}

	private ResultadoBusqueda parseResults(String[][] resultados){
		ResultadoBusqueda response = new ResultadoBusqueda();
		
		//Ejemplo de respuesta:
		//"01202022220202-3", "159.90", "P", "V", "D", "", "14:00","02:25","EZE","USA","20/12/2012","21/12/2012"
		/*
		  	 * [0]: Codigo identificador del asiento.
			 * [1]: Precio base del asiento. 
			 * [2]: Clase del asiento. "P" Primera, "E" Ejecutivo y "C" Turista.
			 * [3]: Ubicacion del asiento. "V" Ventana, "C" Centro y "P" Pasillo.
			 * [4]: Estado del asiento. "D" Disponible, "R" Reservado y "C" Comprado. 
			 * [5]: DNI del cliente que reservo o compro el asiento.
			 * [6]: horario de salida del vuelo con el formato hh:mm.
			 * [7]: horario de llegada del vuelo con el formato hh:mm.
			 * [8]: origen del vuelo
			 * [9]: destino del vuelo
			 * [10]: fecha de salida del vuelo con el formato dd/mm/aaaa
			 * [11]: fecha de llegada del vuelo con el formato dd/mm/aaaa
		  
		 */
		for (int i = 0; i < resultados.length; i++)
		{
			VueloDirecto itinerario = new VueloDirecto();
			
			String[] arrResult = resultados[i];
			itinerario.setAerolinea(this.getAerolinea());
			itinerario.setNumeroVuelo(arrResult[0].split("-")[0]);
			itinerario.setNumeroAsiento(arrResult[0].toString().split("-")[1]);
			
			BigDecimal price = new BigDecimal(new Double(arrResult[1]));
			
			//Agrego el recargo que aplica la aerolinea
			price = price.multiply(this.getRecargo());
			
			itinerario.setPrecio(price);
			itinerario.setTipo(arrResult[2].toCharArray()[0]);
			itinerario.setUbicacion(arrResult[3].toCharArray()[0]);
			
			if (arrResult[4] == "P")
				itinerario.setEstado(true);
			else
				itinerario.setEstado(false);
			
			itinerario.setOrigen(arrResult[8]);
			itinerario.setDestino(arrResult[9]);
			itinerario.setFechaSalida(arrResult[10], arrResult[6]);
			itinerario.setFechaLlegada(arrResult[11], arrResult[7]);
			
			response.agregarItem((Asiento) itinerario);
		}
	
		return response;
		
	}
	
	@Override
	public void comprar(VueloDirecto asiento) {
		InterfaceLanchita lanchita = this.getInstanciaLanchita();
		String codigo = asiento.getNumeroVuelo() + "-" + asiento.getNumeroAsiento();
		
		try {
			lanchita.comprar(codigo);
			this.registroReservas.quitarReserva(asiento);
			this.estadistica.agregarCompras(asiento);
		} catch (EstadoErroneoException e) {
			// En caso de no poder comprar o de estar reservado
			throw new ExcepcionCompraAsiento();
		}
		
	}

	@Override
	public LanchitaAdapter getAerolinea() {
		return this;
	}

	@Override
	public BigDecimal getRecargo() {
		return new java.math.BigDecimal("1.15");
	}
	
	@Override
	public boolean reserva(VueloDirecto asiento){
		InterfaceLanchita lanchita = this.getInstanciaLanchita();
		String codigo = asiento.getNumeroVuelo() + "-" + asiento.getNumeroAsiento();
		try{
			lanchita.reservar( codigo, asiento.getDni());
		}catch(EstadoErroneoException exceptionReserva){
			throw new ExcepcionReservaAsiento();
		}
		return true;
	}

}
